package com.zdatainc.rts.storm; import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.generated.StormTopology; import backtype.storm.StormSubmitter; import backtype.storm.spout.SchemeAsMultiScheme; import backtype.storm.topology.TopologyBuilder; import backtype.storm.tuple.Fields; import storm.kafka.KafkaSpout; import storm.kafka.SpoutConfig; import storm.kafka.ZkHosts; import storm.kafka.StringScheme; public class SentimentAnalysisTopology { private final Logger LOGGER = Logger.getLogger(this.getClass()); private static final String KAFKA_TOPIC = Properties.getString("rts.storm.kafka_topic"); public static void main(String[] args) throws Exception { BasicConfigurator.configure(); if (args != null && args.length > 0) { StormSubmitter.submitTopology( args[0], createConfig(false), createTopology()); } else { LocalCluster cluster = new LocalCluster(); cluster.submitTopology( "sentiment-analysis", createConfig(true), createTopology()); Thread.sleep(60000); cluster.shutdown(); } } private static StormTopology createTopology() { SpoutConfig kafkaConf = new SpoutConfig( new ZkHosts(Properties.getString("rts.storm.zkhosts")), KAFKA_TOPIC, "/kafka", "KafkaSpout"); kafkaConf.scheme = new SchemeAsMultiScheme(new StringScheme()); TopologyBuilder topology = new TopologyBuilder(); topology.setSpout("kafka_spout", new KafkaSpout(kafkaConf), 4); topology.setBolt("twitter_filter", new TwitterFilterBolt(), 4) .shuffleGrouping("kafka_spout"); topology.setBolt("text_filter", new TextFilterBolt(), 4) .shuffleGrouping("twitter_filter"); topology.setBolt("stemming", new StemmingBolt(), 4) .shuffleGrouping("text_filter"); topology.setBolt("positive", new PositiveSentimentBolt(), 4) .shuffleGrouping("stemming"); topology.setBolt("negative", new NegativeSentimentBolt(), 4) .shuffleGrouping("stemming"); topology.setBolt("join", new JoinSentimentsBolt(), 4) .fieldsGrouping("positive", new Fields("tweet_id")) .fieldsGrouping("negative", new Fields("tweet_id")); topology.setBolt("score", new SentimentScoringBolt(), 4) .shuffleGrouping("join"); topology.setBolt("hdfs", new HDFSBolt(), 4) .shuffleGrouping("score"); topology.setBolt("nodejs", new NodeNotifierBolt(), 4) .shuffleGrouping("score"); return topology.createTopology(); } private static Config createConfig(boolean local) { int workers = Properties.getInt("rts.storm.workers"); Config conf = new Config(); conf.setDebug(true); if (local) conf.setMaxTaskParallelism(workers); else conf.setNumWorkers(workers); return conf; } }